VirtualBox lab: Kali (attacker) + Metasploitable2 (target) on host-only network 192.168.56.0/24. nmap -sn found 4 live hosts; nmap -sV -sC against the target turned up the standard Metasploitable2 service set (vsftpd 2.3.4, Samba 3.0.20, UnrealIRCd, Tomcat manager, MySQL 5.0.51a, root shell backdoor on 1524, and more).
Known exploits (Exploit-DB):
- vsftpd 2.3.4 (21) — backdoored, CVE-2011-2523
- Samba 3.0.20 (139/445) — CVE-2007-2447, username map script injection
- UnrealIRCd (6667/6697) — backdoored, CVE-2010-2075
- Tomcat (8180) — default creds, WAR upload RCE
Nmap flags used: -sT connect scan · -sV version detect · -sC default scripts · -O OS detect · -p- all ports · -oN save output · -v verbose
Target: zonetransfer.me (DigiNinja's intentionally misconfigured practice domain).
- A/NS: resolves to
5.196.105.14, served bynszm1/nszm2.digi.ninja - MX: 7 records, all Google Workspace (
ASPMX.L.GOOGLE.COMat priority 0) - TXT: just a Google site-verification string, no SPF
- DKIM (
google._domainkey): NXDOMAIN, not configured. SOA serial shows the zone hasn't changed since 2019. - Zone transfer (
dig axfr @nsztm2.digi.ninja) succeeds outright, dumping the full zone: CERT/HINFO records, an SRV record, internal-looking127.0.0.1entries, and subdomains never surfaced by manual queries.
Takeaway: no SPF or DKIM, so mail spoofed as this domain sails through basic checks, even though the MX records point at real, live Google mail servers. An open zone transfer on top of that hands over the entire internal record set for free.
Target: zonetransfer.me, continuing into the web layer.
- whatweb: Apache, hosted in Germany (OVH), HTTPS + HSTS enforced (
max-age=63072000). Two joke headers (do_not_hack_me, an XSS-styledX-Powered-By) — not real vulnerabilities, just the maintainer's humor. - wafw00f: no WAF detected.
- nikto: confirms Apache, update check returns a 403 (possible light rate-limiting), same joke headers, no CGI directories found.
Takeaway: HTTPS/HSTS is solid and there's no WAF in front of it. The odd headers are cosmetic. Nikto's 403 is worth re-testing with dedicated WAF-bypass techniques if this domain gets revisited.
DVWA via Docker, Security Level: Low.
- Baseline: a single
'breaks the query and returns a raw MariaDB syntax error, confirming unsanitized string concatenation and disclosing the DBMS. - Boolean-based:
' OR '1'='1returns every row in theuserstable instead of one. - UNION-based:
' UNION SELECT user, password FROM users -- -dumps usernames and MD5 password hashes from a completely unrelated table.
Takeaway: classic SQL injection (OWASP A03:2021). Fix: parameterized queries, strict input validation, generic error messages, and bcrypt/Argon2 instead of MD5 for password storage.
image.jpg + flag.enc. The JPEG's exiftool comment field held a hex-encoded PEM private key; decoded it with xxd -r -p into a valid 2048-bit RSA key, then openssl pkeyutl -decrypt against flag.enc recovered the flag: picoCTF{rs4_k3y_1n_1mg_0a64c2f9}
Takeaway: the JPEG COM marker is a blind spot for casual viewers. Hex-encoding stops a plain-text string search but not a metadata-first read. openssl pkeyutl is the current tool; rsautl is deprecated.
Three challenges in one session:
digits.bin— raw bitstream, reconstructed via Python intoflag.jpg. Flag rendered as text in the image:picoCTF{h1dd3n_1n_th3_b1n4ry_3d2e65ba}confidential.pdf—Authormetadata field is base64. Decoded straight to the flag:picoCTF{puzzl3d_m3tadata_f0und!_c999e2a4}img.jpg—Commentfield is base64, decodes tosteghide:<base64>. Decoding again gives the steghide passphrase (pAzzword), used withsteghide extract -sfto pullflag.txt:picoCTF{h1dd3n_1n_1m4g3_1c55ccd0}
Takeaway: layered encoding stops a naive single decode but not repeated decoding. Steghide payloads are invisible to casual viewing; metadata is the way in.
logs.txt is a base64-encoded PNG (base64 -d reveals the PNG/IHDR signature). Saved as img.png: an illustration with a hex string burned into the image itself. tesseract OCR pulled the hex string out; base64 -d rejected it (wrong character set), basenc --base16 -d decoded it to the flag: picoCTF{forensics_analysis_is_amazing_5daa4a2f}
Takeaway: base64 exists to carry binary through text-only channels. OCR catches text baked into pixels that metadata tools miss. A pure hex character set (0-9, uppercase A-F, no +///=) is the signal to reach for basenc --base16 -d instead of base64 -d.